C#でSQLiteを使うと、特有のエラーにハマりやすいです。 特に Microsoft.Data.Sqlite を使う場合、SQL構文・パス・ロック・型などでつまずく人が多い。 この記事では、現場でよく出るエラーを原因 → 解決策の順でまとめています。
この記事でわかること
・near syntax error の原因
・database is locked の対処法
・no such table の原因
・型エラー(GetString/Int32)
・パス・権限エラー
・実務でのベストプラクティス
・near syntax error の原因
・database is locked の対処法
・no such table の原因
・型エラー(GetString/Int32)
・パス・権限エラー
・実務でのベストプラクティス
1. 「SQLite Error 1: near 'xxx': syntax error」
原因
- SQL文の前後に余計な文字がある
- スペース抜けでSQLがつながってしまっている
- カンマ・括弧の閉じ忘れ
例(スペース抜け)
"SELECT * FROM Users" + "WHERE Age > 20"
→ 実際には
`SELECT * FROM UsersWHERE Age > 20` になってエラー。
対処法
- SQLは1行で書く or @"" の複数行文字列を使う
- 連結する場合は必ずスペースを入れる
2. 「SQLite Error 5: database is locked」
原因
- 同じDBを複数の接続が同時に開いている
- reader を閉じていない
- using を使っていない
対処法
- 接続は必ず using で閉じる
- reader も using で閉じる
- 同時書き込みを避ける
正しい例
using var con = new SqliteConnection(cs);
con.Open();
using var cmd = new SqliteCommand(sql, con);
using var reader = cmd.ExecuteReader();
3. 「SQLite Error 1: no such table: Users」
原因
- テーブルがまだ作られていない
- DBファイルのパスが違う(別のDBを見ている)
- 相対パスで実行フォルダが変わっている
対処法
- CREATE TABLE を実行したか確認
- 絶対パスで指定してみる
- 実行時のカレントディレクトリを確認
例:絶対パス
var cs = "Data Source=C:\\data\\sample.db";
4. 「GetString(“Name”) が使えない」
原因
Microsoft.Data.Sqlite の SqliteDataReader は GetString("列名") に対応していないため。
対処法(列番号で読む)
reader.GetString(1);
対処法(列名で読む)
var name = reader["Name"].ToString();
5. 「値がNULLで例外が出る」
原因
GetInt32 / GetString は NULL を許容しない。
対処法
var age = reader.IsDBNull(2) ? (int?)null : reader.GetInt32(2);
6. 「SQLite Error 14: unable to open database file」
原因
- パスが存在しない
- 権限がないフォルダに置いている
- 相対パスで実行フォルダが変わっている
対処法
- 絶対パスで指定する
- Program Files に置かない
- 書き込み可能なフォルダに置く
7. 「SQLite Error 19: constraint failed」
原因
- PRIMARY KEY の重複
- NOT NULL に NULL を入れた
- UNIQUE 制約に違反
対処法
- INSERT前に存在チェック
- NOT NULL の列に値を入れる
8. 「SQLパラメータが反映されない」
原因
- @name と @Name のように大文字小文字が違う
- パラメータを追加していない
正しい例
cmd.Parameters.AddWithValue("@name", name);
9. 業務アプリでのベストプラクティス
- 接続・reader は必ず using で閉じる
- SQLは必ずパラメータ化する
- DBファイルは Program Files に置かない
- 大量データは LIMIT / OFFSET を使う
- バックアップはファイルコピーでOK
まとめ:SQLiteのエラーは原因が決まっている
- syntax error → SQLの前後が壊れている
- locked → 接続/readerを閉じていない
- no such table → パス違い or テーブル未作成
- NULL → IsDBNullでチェック
- パスエラー → 絶対パスで確認
C# × SQLite は軽量で扱いやすいですが、 エラーの原因はほぼパターン化されています。 この記事を参考にすれば、ほとんどの問題はすぐ解決できます。